package com.kotlin.flong.base


fun main(args: Array<String>) {

    //parseType(10)
    //parseType("李飞飞")
    //parseTypeChachu(10)
    //parseTypeChachu("李飞飞")

    var list1 = ArrayList<Apple>()
    setFruitListByOut(list1);

    var list2 = ArrayList<Thing>()
    setFruitListByIn(list2);

    var list3 = ArrayList<Thing>()
    setFruitListByAny(list3);
}

//泛型的使用
fun <T> parseType(thing: T) {

    when (thing) {

        is Int -> println("当前类型是Int型")
        is String -> println("当前类型是String型")
        else -> println("unkonwn")
    }

}


//泛型擦除reified和inline的使用
inline fun <reified T> parseTypeChachu(thing: T) {

    val name = T::class.java.name
    println(name)

}


//--------------泛型类型投射-------------


//T 表示不确定性的，定义泛型和使用泛型
open class Box<T>(var thing: T)


abstract class Thing

abstract class Fruit : Thing()

class Apple : Fruit()

class Orange : Fruit()


//这个方法只能接收Fruit
/*fun setFruitList(list :ArrayList<Fruit>){
	println(list.size)
}*/



//加上这个out关键字表示接收当前类型或它的子类，相当于Java的 ArrayList< ? extends Fruit>
fun setFruitListByOut(list: ArrayList<out Fruit>) {
    println(list.size)
}


//加上这个in关键字表示接收当前类型或它的子类，相当于Java的 ArrayList< ? super Fruit>
fun setFruitListByIn(list: ArrayList<in Fruit>) {
    println(list.size)
}


//接收任何类型，相当于Java的 ArrayList<?>
fun setFruitListByAny(list: ArrayList<*>) {
    println(list.size)
}



